#define _CRT_SECURE_NO_WARNINGS 1



//#define MAX(x, y) ((x)>(y)?(x):(y))
//
//int Max(int x, int y)
//{
//	return x > y ? x : y;
//}
//
////有一个特例
////offsetof - 宏 - 全小写
//
//int main()
//{
//
//	return 0;
//}



//#include <stdio.h>
//
//#define MAX(x, y) ((x)>(y)?(x):(y))
//
//int Max(int x, int y)
//{
//	return x > y ? x : y;
//}
//
//int main()
//{
//	int c = MAX(3, 5);
//	printf("%d\n", c);
//#undef MAX
//	c = MAX(5, -5);
//	printf("%d\n", c);
//
//	return 0;
//}




//#include <stdio.h>
//
//#define M 0
//
//int main()
//{
//#if 1 == M
//	printf("hehe\n");
//#endif
//
//	return 0;
//}




//#include <stdio.h>
//
//#define M 0
//
//int main()
//{
//#if 1 == M
//	printf("hehe\n");
//#elif 2 == M
//	printf("haha\n");
//#else
//	printf("heihei\n");
//#endif
//
//	return 0;
//}




//#include <stdio.h>
//
////#define WIN 0
//
//int main()
//{
//#if defined(WIN)
//	printf("windows");
//#endif
//
//	return 0;
//}



//#include <stdio.h>
//
////#define WIN 0
//
//int main()
//{
//#ifdef WIN
//	printf("windows");
//#endif
//
//	return 0;
//}




//#include <stdio.h>
//
//#define WIN 0
//
//int main()
//{
//#if !defined(WIN)
//	printf("windows\n");
//#endif
//
//	return 0;
//}




//#include <stdio.h>
//
//#define WIN 0
//
//int main()
//{
//#ifndef WIN
//	printf("windows\n");
//#endif
//
//	return 0;
//}




//#if 0
//int main()
//{
//
//	return 0;
//}
//#endif
//
//#include <stdio.h>
//
//int main()
//{
//	printf("hehe\n");
//
//	return 0;
//}




//#include <stdio.h>
//
//int find_single_dog1(int arr[], int sz)
//{
//	int i = 0;
//	int ret = 0;
//
//	for (i = 0; i < sz; i++)
//	{
//		ret ^= arr[i];
//	}
//
//	return ret;
//}
//
//int main()
//{
//	int arr[] = { 1, 2, 3, 4, 7, 1, 2, 3, 4 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int dog = find_single_dog1(arr, sz);
//	printf("%d\n", dog);
//
//	return 0;
//}





//#include <stdio.h>
//
//void find_single_dog2(int arr[], int sz, int* pd1, int* pd2)
//{
//	//1. 所有数字异或在一起
//	int ret = 0;//5 ^ 6
//	int i = 0;
//
//	for (i = 0; i < sz; i++)
//	{
//		ret ^= arr[i];
//	}
//
//	//2. 计算ret的第几位是1
//	int pos = 0;
//	for (i = 0; i < 32; i++)
//	{
//		if (1 == ((ret >> i) & 1))
//		{
//			pos = i;
//			break;
//		}
//	}
//
//	//数组中元素的第pos位为1的异或
//	for (i = 0; i < sz; i++)
//	{
//		if (1 == ((arr[i] >> pos) & 1))
//		{
//			*pd1 ^= arr[i];
//		}
//	}
//
//	//数组中元素的第pos位为0的异或
//	*pd2 = ret ^ *pd1;
//	//     5 ^ 6 ^ 5
//}
//
//int main()
//{
//	int arr[] = { 1, 2, 3, 4, 5, 6, 1, 2, 3, 4 };
//	int dog1 = 0;
//	int dog2 = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	find_single_dog2(arr, sz, &dog1, &dog2);
//	printf("%d %d", dog1, dog2);
//
//
//	return 0;
//}




//#include <stdlib.h>
//#include <stdio.h>
//
//int main()
//{
//	int ret = atoi("    -123");
//	printf("%d\n", ret);
//
//	return 0;
//}



//#include <stdio.h>
//
//int my_atoi(const char* str)
//{
//	int flag = 1;
//	
//	if ('-' == *str)
//	{
//		flag = -1;
//		str++;
//	}
//
//	int ret = 0;
//
//	while (*str)
//	{
//		ret = ret * 10 + (*str - '0');
//		str++;
//	}
//
//	return ret * flag;
//}
//
//int main()
//{
//	//int ret = my_atoi("-123");
//	//int ret = my_atoi("123");
//	int ret = my_atoi("    -123");
//	printf("%d\n", ret);
//
//	return 0;
//}




//#include <stdio.h>
//#include <assert.h>
//#include <ctype.h>
//#include <limits.h>
//
//
////1. 空指针
////2. 空字符串
////3. 空白字符
////4. 数字超过范围
//
//enum State
//{
//	VALID,
//	INVALID
//}state = INVALID;//全局的状态，它的值标志返回的是合法的值还是异常的值
//
//int my_atoi(const char* str)
//{
//	assert(str);
//
//	if ('\0' == *str)//空字符串
//	{
//		return 0;
//	}
//
//	//跳过空白字符
//	while (isspace(*str))
//	{
//		str++;
//	}
//
//
//	//处理正负号的问题
//	int flag = 1;
//
//	if ('-' == *str)
//	{
//		flag = -1;
//		str++;
//	}
//	else if ('+' == *str)
//	{
//		str++;
//	}
//
//	long long ret = 0;
//
//	while (*str)
//	{
//		if (isdigit(*str))
//		{
//			ret = ret * 10 + flag * (*str - '0');
//
//			if (ret < INT_MIN || ret > INT_MAX)
//			{
//				return 0;
//			}
//
//		}
//		else
//		{
//			return (int)ret;
//		}
//
//		str++;
//	}
//
//	state = VALID;
//	return (int)ret;
//}
//
//int main()
//{
//	//int ret = my_atoi("    -123");
//	//int ret = my_atoi("    -123abc456");
//	int ret = my_atoi("    -1111111111111111111111111111");
//
//	if (VALID == state)
//	{
//		printf("%d\n", ret);
//	}
//	else
//	{
//		printf("非法返回:%d\n", ret);
//	}
//
//	return 0;
//}




//#include <stdio.h>
//#include <stddef.h>
//
//struct S
//{
//	char c1;
//	int i;
//	char c2;
//};
//
//int main()
//{
//	printf("%d\n", offsetof(struct S, c1));//0
//	printf("%d\n", offsetof(struct S, i));//4
//	printf("%d\n", offsetof(struct S, c2));//8
//
//	return 0;
//}




//#include <stdio.h>
//
//#define OFFSETOF(type, member) (size_t)&(((type*)0)->member)
//
//struct S
//{
//	char c1;
//	int i;
//	char c2;
//};
//
//int main()
//{
//	printf("%d\n", OFFSETOF(struct S, c1));//0
//	printf("%d\n", OFFSETOF(struct S, i));//4
//	printf("%d\n", OFFSETOF(struct S, c2));//8
//
//	return 0;
//}





//#include <stdio.h>
//
//#define SWAP(n) (n=((n&0xaaaaaaaa)>>1)+((n&0x55555555)<<1))
//
//int main()
//{
//	int n = 10;
//	//1010
//	//0101 - 5
//
//	SWAP(n);
//	printf("%d\n", n);
//
//	SWAP(n);//10
//	printf("%d\n", n);
//
//	return 0;
//}




//#include <stdio.h>
//
//#define SWAP(n) (n=((n&0xaaaaaaaa)>>1)+((n&0x55555555)<<1))
//
////-120
////10000000000000000000000001111000
////11111111111111111111111110000111
////11111111111111111111111110001000
////交换后
////11111111111111111111111101000100
////11111111111111111111111101000011
////10000000000000000000000010111100
//
//int main()
//{
//	int n = -120;
//
//	SWAP(n);
//	printf("%d\n", n);
//
//	return 0;
//}




#include <stdio.h>
#include <string.h>

int main()
{
	char arr[] = "zhangsan@yeah.net";
	char copy[20];
	strcpy(copy, arr);
	char sep[] = "@.";

	char* ret = strtok(copy, sep);
	printf("%s\n", ret);//zhangsan

	ret = strtok(NULL, sep);
	printf("%s\n", ret);//yeah

	ret = strtok(NULL, sep);
	printf("%s\n", ret);//net

	return 0;
}